🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / node / src / androidMain / kotlin / org / meshtastic / feature / node / metrics / TracerouteMapScreen.kt
Displaying Raw • Download
feature/node/src/androidMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteMapScreen.kt 520fa717a938fd84682403b41f57d9f7e1ef49ef (520fa717) Text, 7.02 KB
T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.metrics
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.size
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOf
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.model.TracerouteOverlay
Tff7b72import T7ee787org.meshtastic.core.model.fullRouteDiscovery
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_outgoing_route
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_return_route
Tff7b72import T7ee787org.meshtastic.core.resources.traceroute_showing_nodes
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Route
Tff7b72import T7ee787org.meshtastic.core.ui.theme.TracerouteColors
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalTracerouteMapOverlayInsetsProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalTracerouteMapProvider
Tff7b72import T7ee787org.meshtastic.proto.Position
Tf0883e@Composable
Tff7b72fun Td2a8ffTracerouteMapScreenTb4b4b4(
Te6edf3metricsViewModelTb4b4b4: Te6edf3MetricsViewModelTb4b4b4,
Te6edf3requestIdTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3logUuidTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3metricsViewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3snapshotPositions Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3logUuidTb4b4b4) Tb4b4b4{
Te6edf3logUuidTff7b72?.Te6edf3letTb4b4b4(Te6edf3metricsViewModelTff7b72::Te6edf3tracerouteSnapshotPositionsTb4b4b4) Tff7b72?: Te6edf3flowOfTb4b4b4(Te6edf3emptyMapTff7b72<Tffa657IntTb4b4b4, Te6edf3PositionTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Te6edf3emptyMapTff7b72<Tffa657IntTb4b4b4, Te6edf3PositionTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3tracerouteResult Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3logUuid Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3stateTb4b4b4.Te6edf3tracerouteResultsTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3uuid Tff7b72=Tff7b72= Te6edf3logUuid Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stateTb4b4b4.Te6edf3tracerouteResultsTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fromRadioTb4b4b4.Te6edf3packetTff7b72?.Te6edf3decodedTff7b72?.Te6edf3request_id Tff7b72=Tff7b72= Te6edf3requestId Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3routeDiscovery Tff7b72= Te6edf3tracerouteResultTff7b72?.Te6edf3fromRadioTff7b72?.Te6edf3packetTff7b72?.Te6edf3fullRouteDiscovery
Tff7b72val Te6edf3overlayFromLogs Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3routeDiscoveryTb4b4b4, Te6edf3requestIdTb4b4b4) Tb4b4b4{
Te6edf3routeDiscoveryTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3TracerouteOverlayTb4b4b4(Te6edf3requestIdTb4b4b4, Tffa657itTb4b4b4.Te6edf3routeTb4b4b4, Tffa657itTb4b4b4.Te6edf3route_backTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3overlayFromService Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3requestIdTb4b4b4) Tb4b4b4{ Te6edf3metricsViewModelTb4b4b4.Te6edf3getTracerouteOverlayTb4b4b4(Te6edf3requestIdTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3overlay Tff7b72= Te6edf3overlayFromLogs Tff7b72?: Te6edf3overlayFromService
Te6edf3LaunchedEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{ Te6edf3metricsViewModelTb4b4b4.Te6edf3clearTracerouteResponseTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3TracerouteMapScaffoldTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stateTb4b4b4.Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3long_name Tff7b72?: Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3tracerouteTb4b4b4)Tb4b4b4,
Te6edf3overlay Tff7b72= Te6edf3overlayTb4b4b4,
Te6edf3snapshotPositions Tff7b72= Te6edf3snapshotPositionsTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffTracerouteMapScaffoldTb4b4b4(
Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3overlayTb4b4b4: Te6edf3TracerouteOverlay?Tb4b4b4,
Te6edf3snapshotPositionsTb4b4b4: Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3PositionTff7b72>Tb4b4b4,
Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3tracerouteNodesShown Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3tracerouteNodesTotal Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3insets Tff7b72= Te6edf3LocalTracerouteMapOverlayInsetsProviderTb4b4b4.Te6edf3current
Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LocalTracerouteMapProviderTb4b4b4.Te6edf3currentTb4b4b4(
Te6edf3overlayTb4b4b4,
Te6edf3snapshotPositionsTb4b4b4,
Tb4b4b4{ Te6edf3shownTb4b4b4: Tffa657IntTb4b4b4, Te6edf3totalTb4b4b4: Tffa657Int Tff7b72-Tff7b72>
Te6edf3tracerouteNodesShown Tff7b72= Te6edf3shown
Te6edf3tracerouteNodesTotal Tff7b72= Te6edf3total
Tb4b4b4}Tb4b4b4,
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3insetsTb4b4b4.Te6edf3overlayAlignmentTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3insetsTb4b4b4.Te6edf3overlayPaddingTb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3insetsTb4b4b4.Te6edf3contentHorizontalAlignmentTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TracerouteNodeCountTb4b4b4(Te6edf3shown Tff7b72= Te6edf3tracerouteNodesShownTb4b4b4, Te6edf3total Tff7b72= Te6edf3tracerouteNodesTotalTb4b4b4)
Te6edf3TracerouteLegendTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffTracerouteLegendTb4b4b4(Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3LegendRowTb4b4b4(
Te6edf3color Tff7b72= Te6edf3TracerouteColorsTb4b4b4.Te6edf3OutgoingRouteTb4b4b4,
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_outgoing_routeTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3LegendRowTb4b4b4(Te6edf3color Tff7b72= Te6edf3TracerouteColorsTb4b4b4.Te6edf3ReturnRouteTb4b4b4, Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_return_routeTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffTracerouteNodeCountTb4b4b4(Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4, Te6edf3shownTb4b4b4: Tffa657IntTb4b4b4, Te6edf3totalTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3traceroute_showing_nodesTb4b4b4, Te6edf3shownTb4b4b4, Te6edf3totalTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelMediumTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffLegendRowTb4b4b4(Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4, Te6edf3labelTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3RouteTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3tint Tff7b72= Te6edf3colorTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff1T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3labelTb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelMediumTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.06s